package com.bw.crop.config;

import com.bw.crop.domain.SysLogsWarehouse;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;

public class TestLogObjectPool {
    //jingtai
    private static TestLogObjectPool logObjectPool;
    private final List<SysLogsWarehouse> pool;
    private final int maxPoolSize;
    private final ReentrantLock lock = new ReentrantLock();

    //siyou
    public TestLogObjectPool(int maxPoolSize) {
        this.maxPoolSize = maxPoolSize;
        this.pool = new ArrayList<>(maxPoolSize);
        // 初始化对象池
        for (int i = 0; i < maxPoolSize; i++) {
            pool.add(new SysLogsWarehouse()); // 假设Serri有一个无参构造函数
        }
    }
    // 提供一个静态方法获取单例对象
    public static TestLogObjectPool getInstance(int maxPoolSize){
        // 双重检查锁定实现线程安全的单例
        if (logObjectPool == null) {
            synchronized (TestLogObjectPool.class) {
                if (logObjectPool == null) {
                    logObjectPool = new TestLogObjectPool(maxPoolSize);
                }
            }
        }
        return logObjectPool;
    }
    // 提供一个获取单例对象的方法，如果实例已经存在，则直接返回
    public static TestLogObjectPool getInstance() {
        return logObjectPool;
    }
    public SysLogsWarehouse borrowObject() {
        lock.lock();
        try {
            if (pool.isEmpty()) {
                // 如果池为空，可以选择抛出异常、等待或创建新对象（但这里我们假设池大小固定）
                throw new IllegalStateException("Object pool is empty");
            }
            // 移除并返回池中的一个对象
            return pool.remove(pool.size() - 1); // 假设从尾部移除
        } finally {
            lock.unlock();
        }
    }
    public void returnObject(SysLogsWarehouse serri) {
        lock.lock();
        try {
            // 在将对象放回池之前，可能需要重置对象的状态
            // serri.reset(); // 假设Serri有一个reset方法用于重置状态

            // 如果池未满，将对象放回池中
            if (pool.size() < maxPoolSize) {
                pool.add(serri);
            }
        } finally {
            lock.unlock();
        }
    }
}